//
// Created by Jisam on 2024/8/14 21:33.
// solve d
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <cstdint>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <vector>

using namespace std;

#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define u32 unsigned
#define i64 long long
#define u64 unsigned long long

using namespace std;
/**
 * 计算给定数组的奇偶性
 *
 * 该函数通过遍历数组中的元素，并根据元素的排列循环特性来计算数组的奇偶性。
 * 数组的奇偶性是指数组中所有循环排列的长度的奇偶性。
 *
 * @param a 一个整数数组，用于计算奇偶性
 * @return 返回数组的奇偶性，0表示偶数，1表示奇数
 */
int parity(const vector<int> &a) {
    // 获取数组的大小
    const int n = a.size();
    // 创建一个标记数组，用于记录元素是否已被访问
    vector<bool> vis(n);
    // 初始化奇偶性标志，如果数组大小为偶数，则为0；如果为奇数，则为1
    int p = n % 2;
    // 遍历数组中的每个元素
    for (int i = 0; i < n; i++) {
        // 如果当前元素已访问，则跳过
        if (vis[i]) {
            continue;
        }
        // 遍历当前元素开始的循环，直到回到起点
        for (int j = i; !vis[j]; j = a[j]) {
            // 标记循环中的元素为已访问
            vis[j] = true;
        }
        // 更新奇偶性标志，每次遇到一个循环，就取反
        p ^= 1;
    }
    // 返回计算得到的奇偶性
    return p;
}

// 检查两个数组是否可以通过有限次数的交换变为彼此
void solve() {
    // 读取数组的大小
    int n;
    cin >> n;

    // 初始化两个数组
    vector<int> a(n), b(n);
    // 读取第一个数组，并将其值减一，以适应从零开始的索引
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        a[i]--;
    }
    // 读取第二个数组，并将其值减一，以适应从零开始的索引
    for (int i = 0; i < n; i++) {
        cin >> b[i];
        b[i]--;
    }

    // 创建排序的副本，以比较两个数组的排序状态
    auto a_sort = a, b_sort = b;
    sort(a_sort.begin(), a_sort.end());
    sort(b_sort.begin(), b_sort.end());
    // 如果排序后的数组不相同，则输出"NO"并返回
    if (a_sort != b_sort) {
        cout << "NO\n";
        return;
    }

    // 将数组a和b中的元素替换为其在排序数组中的索引
    for (int i = 0; i < n; i++) {
        a[i] = lower_bound(a_sort.begin(), a_sort.end(), a[i]) - a_sort.begin();
    }
    for (int i = 0; i < n; i++) {
        b[i] = lower_bound(b_sort.begin(), b_sort.end(), b[i]) - b_sort.begin();
    }

    // 检查两个数组的奇偶性是否相同
    // 如果不相同，则输出"NO"，否则输出"YES"
    if (parity(a) != parity(b)) {
        cout << "NO\n";
    } else {
        cout << "YES\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}